SOFR Curve Construction

The purpose of this notebook is to explore different methodologies for constructing a SOFR curve.

Method 1 - Bootstrapping from 1M SOFR Futures

1M SOFR Futures have the following features:

  1. Unlike 3M Futures which are based on a business day compounded rate; 1M SOFR Futures are priced based on an arithmetic average across calendar days:
$$P_{SR1} = [1 - \frac{1}{N_m}\sum_{d=1}^{N_m}r_{d}] \times 100$$
  1. For the front contract, we can split this equation into SOFR fixings vs 1 day forward SOFR:
$$P_{SR1} = [1 - \frac{1}{N_m}(\sum_{d=1}^{n_{obs}}r_{d}^{fix} + \sum_{d=n_{fwd}}^{N_m}r_{d}^{fwd})] \times 100$$
  1. Although SOFR fixings fluctuate on a daily basis, they tend to jump following FOMC meets by the amount of any rate decision. We can therefore further split the above equation into fixings, fwd SOFR pre-meet, fwd SOFR post-meet.
$$P_{SR1} = [1 - \frac{1}{N_m}(\sum_{d=1}^{n_{obs}}r_{d}^{fix} + \sum_{d=n_{fwd:pre}}^{n_{meet}}r_{d}^{fwd:pre} + \sum_{d=n_{meet}}^{N_m}r_{d}^{fwd:post})] \times 100$$
  1. For the purpose of this exercise, I have made a simplifying assumption that SOFR will remain constant between meeting dates (note that I will relax this assumption slightly later). For the front contract, the pre-meet SOFR is assumed to remain at the last fixing. This leaves us with the following equation:
$$P_{SR1} = [1 - \frac{1}{N_m}(\sum_{d=1}^{n_{obs}}r_{d}^{fix} + r_{n_{obs}}^{fix} \times (n_{meet} - n_{obs}) + \sum_{d=n_{meet}}^{N_m}r_{d}^{fwd:post})] \times 100$$$$P_{SR1} = [1 - \frac{1}{N_m}(\sum_{d=1}^{n_{obs}}r_{d}^{fix} + r_{n_{obs}}^{fix}(n_{meet} - n_{obs}) + r^{fwd:post}(N_m - n_{meet}))] \times 100$$
  1. Now we can rearrange the above and solve for the one unknown parameter $r_{d}^{fwd:post}$ which is the forward SOFR rate post meeting
$$ r^{fwd:post} = \frac{[1 - \frac{P_{SR1}}{100}] \times N_m - \sum_{d=1}^{n_{obs}}r_{d}^{fix} - r_{n_{obs}}^{fix}(n_{meet} - n_{obs})}{N_m-n_{meet}}$$

Curve + a problem

The below chart shows our bootstrapped SOFR curve.

However, there is a problem... because we are only allowing SOFR to jump on FOMC meets, for months in which there is no SOFR meeting the price information given by that future is essentially disregarded, as there is no date on which the rate can adjust to meet what the future is implying. Therefore, if we were to use this curve to price those futures, there would be a small pricing error.

A solution...

Although SOFR can reasonably be expected to jump by the amount of a fed hike following a FOMC meeting, it can still fix in a range on a daily basis. In particular month ends seem to be dates on which SOFR jumps small amounts. Therefore, I am loosening the assumption that SOFR can only jump on FOMC dates, and allowing it to also jump at the start of the month, for months in which there is no FOMC meet.

Method 2: bootstrapping using 3M SOFR Futures (TODO)